home *** CD-ROM | disk | FTP | other *** search
/ F1 Licenseware / F1 Licenseware - Volume 1.iso / disks / 079c.dms / 079c.adf / how2writeagame.lha / how2write_a_game / pacman.asc < prev   
Text File  |  1992-03-06  |  39KB  |  1,398 lines

  1. ' *************************************************************
  2. '
  3. '              ======================================
  4. '
  5. '              PACMAN SAUCE - Makes A Change From HP!  
  6. '
  7. '              ======================================  
  8. '
  9. '                      /\/\/\/\/\/\/\/\/\  
  10. '                      By: Paul Nordovics  
  11. '                      \/\/\/\/\/\/\/\/\/  
  12. '  
  13. ' Notes: 
  14. ' ====== 
  15. '
  16. ' WARNING: THIS PROGRAM DISABLES KEYBOARD CHECKS AND SO YOU
  17. ' WON'T BE ABLE TO RETURN TO THE EDITOR BY PRESSING CTRL AND C.  
  18. ' IF YOU DO WANT TO COME BACK HERE READ THE COMMENTS AT LINES
  19. ' 24-30 AND 93-100 
  20. '
  21. ' *************************************************************
  22. '
  23. ' *************************************************************  
  24. ' Used To Increase Speed Of Program By Up To 10% 
  25. ' If You Don't Have The Compiler Extension Loaded You Will Get 
  26. ' An Error Here.  Don't Worry, The Game Will Still Work, But 
  27. ' You Will Have To Delete This Line Or Put A ' In Front Of The 
  28. ' Command e.g. 'Comp Test Off
  29. ' Also BE WARNED That If You Leave This Command In, You Can't
  30. ' Break Out Of The Program Using Ctrl And C! 
  31. ' *************************************************************  
  32. Comp Test Off 
  33. '
  34. ' ******************** 
  35. ' Remove Mouse Pointer 
  36. ' ******************** 
  37. Hide 
  38. '
  39. Screen Close 0
  40. '
  41. ' *************************************************************
  42. ' This Was Used So I Could Easily Re-load Any Graphics That Had
  43. ' Been Altered Back Into Bank 1
  44. ' *************************************************************
  45. _LOAD=0
  46. If _LOAD=1
  47.    K$="me_disk:gfx/"
  48.    Load K$+"pill.abk"
  49.    Load K$+"wall.abk",1
  50.    Load K$+"fruit.abk",1
  51.    Load K$+"pacman.abk",1
  52.    Load K$+"score.abk",1
  53.    Load K$+"message.abk",1
  54.    Load K$+"ghosts.abk",1
  55. End If 
  56. '
  57. ' -------------------------------------------------------------
  58. '
  59. ' *************************************************************
  60. '                         INITIALIZATION 
  61. ' *************************************************************
  62. '
  63. ' *************************************************************
  64. ' Maze Information:
  65. ' Constants Are Used So If Any Values Are Changed, It Is A Lot 
  66. ' Easier To Alter The Value Here Than Go Through The Entire
  67. ' Program Changing Values
  68. ' *************************************************************  
  69. _DOT_START=1
  70. _DOT_END=6
  71. PILL_START=7
  72. PILL_END=10
  73. WALL_START=11
  74. '
  75. NUMBER_OF_MAZES=20
  76. '
  77. ' *************************************************************
  78. ' Load In The Map Data From Disk.  It Is Done This Way, Rather 
  79. ' Than Being Permanently Stored In A Bank Because The Mapper 
  80. ' Can Also Load In The Same Data From Disk To Enable Further 
  81. ' Alterations To Be Made 
  82. ' *************************************************************
  83. Load "me_disk:map_data.abk",10
  84. '
  85. ' *************************************************************
  86. ' Get The Starting Address Of The Part Of Memory Where The 
  87. ' Current Maze Map Data Will Be Stored.  This Makes It Easier
  88. ' If Changes Are Made As We Only Have To Change The Value Here 
  89. ' *************************************************************
  90. MAZE_ADDR=Start(10)+(NUMBER_OF_MAZES*260)
  91. '
  92. ' *************************************************************
  93. ' Wait For Disk Activity To Finish And Then Turn Off Interrupts
  94. ' And Multi-tasking To Speed Things Up A Little.  I Got This 
  95. ' From A Recent AMOSZINE Article Which Goes To Show That Even
  96. ' The Experts (Ha! Ha!) Can Still Learn A Thing Or Two 
  97. ' BE WARNED That This Command Stops You From Breaking Out Of 
  98. ' The Program By Using Ctrl And C So Put A ' In Front Of The 
  99. ' Command If You Want To Come Back To The Editor 
  100. ' e.g. '_FORBID=Execall(-132)
  101. ' *************************************************************
  102. Wait 250
  103. _FORBID=Execall(-132)
  104. '
  105. ' *************************************************************  
  106. ' Set Up Pacman Animation Table  
  107. ' *************************************************************  
  108. Dim PACMAN_ANIM(56)
  109. Restore PACMAN_ANIM_DATA
  110. For K=0 To 55
  111.    Read PACMAN_ANIM(K)
  112. Next K
  113. '
  114. ' *************************************************************
  115. ' These Values Correspond To Offsets In The Pacman Animation 
  116. ' Table Which Get To The Correct Set Of Frames.  Offsets Are 
  117. ' Used So If Extra Frames Are Added We Only Need To Change The 
  118. ' Values Here
  119. ' *************************************************************
  120. PACMAN_UP_ANIM=0
  121. PACMAN_RIGHT_ANIM=11
  122. PACMAN_DOWN_ANIM=22
  123. PACMAN_LEFT_ANIM=33
  124. PACMAN_DYING_ANIM=44
  125. '
  126. ' *************************************************************  
  127. ' Initialize Ghosts  
  128. ' GHOST_NUMBER Can Be Changed To Values 0,1 Or 2 And Represents
  129. ' The Number Of Ghosts In Maze - 1.  By Setting This Value 
  130. ' First And Then Dimming The Arrays, You Don't Have To Change  
  131. ' The Value Of Every Array If You Decide To Change The Number  
  132. ' Off Ghosts 
  133. ' *************************************************************  
  134. GHOST_NUMBER=2
  135. Dim GHOST_X(GHOST_NUMBER)
  136. Dim GHOST_Y(GHOST_NUMBER)
  137. Dim GHOST_DIRECTION(GHOST_NUMBER)
  138. Dim GHOST_SPEED(GHOST_NUMBER)
  139. Dim GHOST_FRAME(GHOST_NUMBER)
  140. Dim GHOST_STATE(GHOST_NUMBER)
  141. '
  142. ' *************************************************************  
  143. ' Set Up Ghost Animation Table 
  144. ' *************************************************************  
  145. Dim GHOST_ANIM(27)
  146. Restore GHOST_ANIM_DATA
  147. For K=0 To 26
  148.    Read GHOST_ANIM(K)
  149. Next K
  150. '
  151. Dim GHOST_ANIM_START(GHOST_NUMBER)
  152. Dim GHOST_ANIM_POINTER(GHOST_NUMBER)
  153. '
  154. Dim GHOST_COLOUR(GHOST_NUMBER)
  155. Dim GHOST_FLASH(GHOST_NUMBER)
  156. Dim GHOST_EYES_TIMER(GHOST_NUMBER)
  157. Dim GHOST_EYES_FLASH(GHOST_NUMBER)
  158. '
  159. ' *************************************************************  
  160. ' This Array Will Hold Values Corresponding To Directions The
  161. ' Ghosts Can Take When It Wants To Make A New Move.  The Values  
  162. ' Will Be Generated Randomly During The Level Set-Up Instead 
  163. ' Of During The Main Loop  
  164. ' *************************************************************  
  165. Dim GHOST_DIRECTION_LUT(50)
  166. '
  167. ' *************************************************************
  168. ' Fruit
  169. ' *************************************************************
  170. ' *************************************************************  
  171. ' This Array Will Hold The X,Y Co-ords Of The Fruit And Frame
  172. ' Value.  The Values Are Generated Randomly Before The Main
  173. ' Loop Is Started And Can Then Be Looked Up During The Game  
  174. ' *************************************************************  
  175. Dim FRUIT_INFO(30)
  176. '
  177. ' *************************************************************
  178. ' This Constant Decides How Long It Is Before The Fruit Appears  
  179. ' In The Maze.  The Value Is Decreased By 1 Each Time And When 
  180. ' This 
  181. ' *************************************************************
  182. FRUIT_TIMER_START=300
  183. '
  184. ' *************************************************************
  185. ' This Constant Decides How Long The Effect A Pill Will Have 
  186. ' *************************************************************
  187. PILL_TIMER_START=200
  188. '
  189. ' *************************************************************
  190. ' This Constant Decides How Long The Ghost Will Remain As Just 
  191. ' Eyes 
  192. ' *************************************************************
  193. GHOST_EYES_TIMER_START=200
  194. '
  195. PACMAN_HISCORE=1000
  196. '
  197. ' -------------------------------------------------------------
  198. '
  199. ' *************************************************************  
  200. '                       Set Up Display 
  201. ' *************************************************************  
  202. ' *************************************************************  
  203. ' Maze Screen: Uses Double Buffering To Prevent Flickering 
  204. ' *************************************************************  
  205. Screen Open 0,320,208,8,Lowres : Curs Off : Flash Off 
  206. Screen Display 0,128,45,,
  207. For K=0 To 31 : Colour K,0 : Next K
  208. Double Buffer 
  209. '
  210. ' *************************************************************
  211. ' Panel Screen: Uses Single Buffer Cos It's Less Hassle
  212. ' *************************************************************
  213. Screen Open 1,320,32,8,Lowres : Curs Off : Flash Off 
  214. Screen Display 1,128,45+208,,
  215. For K=0 To 31 : Colour K,0 : Next K
  216. Pen 1 : Paper 0
  217. '
  218. Bob Update Off 
  219. '
  220. Goto NEW_GAME
  221. '
  222. ' -------------------------------------------------------------
  223. '
  224. ' *************************************************************
  225. '                            MAIN LOOP 
  226. ' *************************************************************
  227. MAIN_LOOP:
  228. Repeat 
  229.    Wait Vbl 
  230.    Bob Clear 
  231.    If GAME_CYCLE=0
  232.       Gosub _DO_PACMAN
  233.       Gosub _DO_FRUIT
  234.    Else 
  235.       Gosub _DO_GHOSTS
  236.    End If 
  237.    Gosub _DO_PACMAN_ANIM
  238.    Gosub _DRAW_ALL
  239.    Add GAME_CYCLE,1,0 To 1
  240.    Bob Draw 
  241.    Screen Swap 
  242. Until ALL_DONE=5 or PACMAN_STATE=4
  243. '
  244. ' ************************************************** 
  245. ' Main Loop Has Been Exited So First Tidy Up Display 
  246. ' ************************************************** 
  247. ' *************
  248. ' Remove Pacman
  249. ' *************
  250. Bob Off 1
  251. ' *************
  252. ' Remove Ghosts
  253. ' *************
  254. For K=0 To GHOST_NUMBER : Sprite Off(K*2)+2 : Next K
  255. ' ************ 
  256. ' Remove Fruit 
  257. ' ************ 
  258. Bob Off 0
  259. ' *******************************
  260. ' Ensure Anything Eaten By Pacman  
  261. ' Is Completely Erased From Maze 
  262. ' *******************************
  263. Autoback 2
  264. If _DOT_GOT>0 Then Cls 0,_DOT_X,_DOT_Y To _DOT_X+15,_DOT_Y+15
  265. _DOT_GOT=0
  266. If PILL_GOT>0 Then Cls 0,PILL_X,PILL_Y To PILL_X+15,PILL_Y+15
  267. PILL_GOT=0
  268. '
  269. ' *****************
  270. ' Clear Bob Buffers
  271. ' *****************
  272. Autoback 0
  273. For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
  274. '
  275. Wait 25
  276. '
  277. ' ***************
  278. ' Level Complete!
  279. ' ***************
  280. If ALL_DONE=5
  281.    ' ********** 
  282.    ' Flash Maze 
  283.    ' ********** 
  284.    X=0
  285.    For K=0 To 10
  286.       If X=0
  287.          Colour 2,$22F
  288.       Else 
  289.          Colour 2,$FFF
  290.       End If 
  291.       X=1-X
  292.       Wait 15
  293.    Next K
  294.    ' **************** 
  295.    ' Get To Next Maze 
  296.    ' **************** 
  297.    Add MAZE_NUMBER,1
  298.    ' *****************
  299.    ' Is Game Completed
  300.    ' *****************
  301.    If MAZE_NUMBER=NUMBER_OF_MAZES
  302.       Wait 25
  303.       ' *************************************
  304.       ' Show Patronising Message "WELL DONE!"
  305.       ' *************************************
  306.       Autoback 0
  307.       Bob Clear 
  308.       Bob 0,120,80,87
  309.       Bob Draw 
  310.       Screen Swap 
  311.       Wait 50
  312.       ' *******************
  313.       ' Remove Said Message
  314.       ' *******************
  315.       Bob Off 0
  316.       For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
  317.       Wait 50
  318.       ' ***********************************************
  319.       ' Fade Out Maze And Re-Start Game From First Maze
  320.       ' ***********************************************
  321.       Fade 5 : Wait 75
  322.       Goto NEW_GAME
  323.    End If 
  324.    ' *****************************************************
  325.    ' If Not Last Level, Fade Out Maze And Go Onto Next One
  326.    ' *****************************************************
  327.    Wait 10
  328.    Fade 5 : Wait 75
  329.    Goto NEW_LEVEL
  330. End If 
  331. '
  332. ' *****************
  333. ' Pacman Was Killed
  334. ' *****************
  335. If PACMAN_STATE=4
  336.    Add PACMAN_LIVES,-1
  337.    ' ************ 
  338.    ' Is Game Over 
  339.    ' ************ 
  340.    If PACMAN_LIVES=0
  341.       ' *****************************
  342.       ' Remove Last Pacman From Panel
  343.       ' *****************************
  344.       Screen 1
  345.       Cls 0,16,8 To 32,24
  346.       '
  347.       Wait 50
  348.       ' *************************
  349.       ' Show Message "GAME OVER!"
  350.       ' *************************
  351.       Screen 0
  352.       Autoback 0
  353.       Bob Clear 
  354.       Bob 0,120,80,88
  355.       Bob Draw 
  356.       Screen Swap 
  357.       Wait 50
  358.       ' ************** 
  359.       ' Remove Message 
  360.       ' ************** 
  361.       Bob Off 0
  362.       For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
  363.       '
  364.       Wait 50
  365.       '
  366.       ' ***********************************************
  367.       ' Fade Out Maze And Re-Start Game From First Maze
  368.       ' ***********************************************
  369.       Fade 5 : Wait 75
  370.       Goto NEW_GAME
  371.    End If 
  372.    ' ***********************************************  
  373.    ' If Lives Left, Fade Out And Re-Try Current Maze  
  374.    ' ***********************************************  
  375.    Wait 10
  376.    Fade 5 : Wait 75
  377.    Goto NEW_LEVEL
  378. End If 
  379. '
  380. ' -------------------------------------------------------------
  381. '
  382. ' *************************************************************
  383. '                              NEW GAME  
  384. ' *************************************************************
  385. NEW_GAME:
  386. PACMAN_LIVES=5
  387. PACMAN_SCORE=0
  388. '
  389. MAZE_NUMBER=0
  390. '
  391. Goto NEW_LEVEL
  392. '
  393. ' -------------------------------------------------------------
  394. '
  395. ' *************************************************************
  396. '                             NEW LEVEL
  397. ' *************************************************************
  398. NEW_LEVEL:
  399. ' *************************************************************  
  400. ' Copy Current Maze Data Into Work Buffer Which We Can Safely
  401. ' Overwrite  
  402. ' *************************************************************  
  403. Z=Start(10)+MAZE_NUMBER*260
  404. For K=0 To 259
  405.    Poke MAZE_ADDR+K,Peek(Z+K)
  406. Next K
  407. '
  408. ' *************
  409. ' Set Up Pacman
  410. ' *************
  411. PACMAN_X=16 : PACMAN_Y=16
  412. PACMAN_DIRECTION=0 : PACMAN_SPEED=2
  413. PACMAN_ANIM_START=PACMAN_RIGHT_ANIM : PACMAN_ANIM_POINTER=0
  414. PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START)
  415. PACMAN_STATE=0
  416. '
  417. ' *************
  418. ' Set Up Ghosts
  419. ' *************
  420. Z=MAZE_ADDR
  421. For K=0 To GHOST_NUMBER
  422.    Repeat 
  423.       X=Rnd(19) : Y=Rnd(12)
  424.    Until Peek(Z+X+(Y*20))<WALL_START and Abs((X*16)-PACMAN_X)>64 and Abs((Y*16)-PACMAN_Y)>64
  425.    GHOST_X(K)=X*16 : GHOST_Y(K)=Y*16
  426.    GHOST_DIRECTION(K)=0 : GHOST_SPEED(K)=2
  427.    GHOST_STATE(K)=0
  428.    GHOST_COLOUR(K)=Rnd(2)
  429.    GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
  430.    GHOST_ANIM_POINTER(K)=0
  431.    GHOST_FRAME(K)=GHOST_ANIM(GHOST_ANIM_START(K)+GHOST_ANIM_POINTER(K))
  432.    GHOST_FLASH(K)=0
  433.    GHOST_EYES_TIMER(K)=0
  434.    GHOST_EYES_FLASH(K)=0
  435. Next K
  436. '
  437. ' ************************** 
  438. ' Set Up Ghost Direction LUT 
  439. ' ************************** 
  440. For K=0 To 49
  441.    GHOST_DIRECTION_LUT(K)=Rnd(3)+1
  442. Next K
  443. '
  444. GHOST_DIRECTION_LUT(50)=-1
  445. GHOST_DIRECTION_POINTER=0
  446. '
  447. ' ************ 
  448. ' Set Up Fruit 
  449. ' ************ 
  450. FRUIT_STATE=0
  451. FRUIT_TIMER=FRUIT_TIMER_START
  452. '
  453. ' ***********************  
  454. ' Fruit Information Table  
  455. ' ***********************  
  456. Z=MAZE_ADDR
  457. For K=0 To 9
  458.    Repeat 
  459.       X=Rnd(19) : Y=Rnd(12)
  460.    Until Peek(Z+X+(Y*20))<WALL_START
  461.    FRUIT_INFO(K*3)=X*16 : FRUIT_INFO((K*3)+1)=Y*16 : FRUIT_INFO((K*3)+2)=43+Rnd(3)
  462. Next K
  463. '
  464. FRUIT_INFO(30)=-1
  465. FRUIT_INFO_POINTER=0
  466. '
  467. ' *********************
  468. ' Reset This Little Lot
  469. ' *********************  
  470. _DOT_TO_COLLECT=0
  471. _DOT_GOT=0
  472. PILL_GOT=0
  473. PILL_TIMER=0
  474. ALL_DONE=0
  475. '
  476. ' *******************
  477. ' Set Up Status Panel
  478. ' *******************
  479. Screen 1
  480. Cls 0
  481. Gosub _SHOW_LIVES
  482. Locate 19+6,1 : Print "SCORE:"
  483. Locate 17+6,2 : Print "HISCORE:"
  484. Gosub _SHOW_SCORE
  485. '
  486. ' *************
  487. ' Fade In Panel
  488. ' *************
  489. Fade 5 To -1 : Wait 75
  490. '
  491. ' *******************
  492. ' Set Up Maze Display  
  493. ' *******************
  494. Screen 0
  495. '
  496. ' *********
  497. ' Draw Maze
  498. ' *********
  499. ' *************************************
  500. ' Draw To Both Screens Of Double Buffer
  501. ' *************************************
  502. Autoback 1
  503. '
  504. Cls 0
  505. '
  506. ' *********************************
  507. ' Find Start Of This Mazes Map Data
  508. ' *********************************
  509. MAZE_POINTER=MAZE_ADDR
  510. '
  511. ' ********************** 
  512. ' Draw In Each Map Block 
  513. ' ********************** 
  514. For Y=0 To 12
  515.    For X=0 To 19
  516.       '
  517.       BLOCK_NUMBER=Peek(MAZE_POINTER)
  518.       If BLOCK_NUMBER>0 Then Paste Bob X*16,Y*16,BLOCK_NUMBER
  519.       '
  520.       ' ************************************************************ 
  521.       ' Look For Dots.  If One Found, Increase The Amount To Collect 
  522.       ' Variable 
  523.       ' ************************************************************ 
  524.       If Peek(MAZE_POINTER)>=_DOT_START and Peek(MAZE_POINTER)<=_DOT_END
  525.          Add _DOT_TO_COLLECT,1
  526.       End If 
  527.       Add MAZE_POINTER,1
  528.    Next X
  529. Next Y
  530. '
  531. ' ************ 
  532. ' Fade In Maze 
  533. ' ************ 
  534. Fade 5 To -1 : Wait 75
  535. '
  536. ' *************************************************************
  537. ' Change Drawing Mode So Output Is Only Done To The Logical  
  538. ' Screen 
  539. ' *************************************************************
  540. Autoback 0
  541. '
  542. ' ***********************************
  543. ' Show Message "Press Fire To Start!"
  544. ' ***********************************
  545. Bob Clear 
  546. Bob 0,120,80,85
  547. Bob 1,120,96,86
  548. Bob Draw 
  549. Screen Swap 
  550. '
  551. Repeat : Until Fire(1)
  552. '
  553. ' ************** 
  554. ' Remove Message 
  555. ' ************** 
  556. Bob Off 0 : Bob Off 1
  557. For K=0 To 1 : Bob Clear : Bob Draw : Screen Swap : Next K
  558. '
  559. Wait 30
  560. '
  561. ' ********************** 
  562. ' Show Pacman And Ghosts 
  563. ' ********************** 
  564. Bob Clear 
  565. Gosub _DRAW_ALL
  566. Bob Draw 
  567. Screen Swap 
  568. '
  569. Wait 30
  570. '
  571. Goto MAIN_LOOP
  572. '
  573. ' -------------------------------------------------------------
  574. '
  575. ' *************************************************************
  576. '                              DO PACMAN 
  577. ' *************************************************************
  578. _DO_PACMAN:
  579. If PACMAN_STATE=0
  580.    PACMAN_DIRECTION_CHANGED=0
  581.    ' *************
  582.    ' Try And Go Up
  583.    ' *************
  584.    If(Joy(1)=1 or Joy(1)=9 or Joy(1)=5) and PACMAN_DIRECTION<>1
  585.       X0=PACMAN_X/16
  586.       X1=(PACMAN_X+15)/16
  587.       Y0=(PACMAN_Y-PACMAN_SPEED)/16
  588.       Z=MAZE_ADDR
  589.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  590.          PACMAN_DIRECTION=1
  591.          PACMAN_ANIM_START=PACMAN_UP_ANIM : PACMAN_ANIM_POINTER=0
  592.          PACMAN_DIRECTION_CHANGED=1
  593.       End If 
  594.    End If 
  595.    '
  596.    ' **************** 
  597.    ' Try And Go Right 
  598.    ' **************** 
  599.    If(Joy(1)=8 or Joy(1)=9 or Joy(1)=10) and PACMAN_DIRECTION<>2 and PACMAN_DIRECTION_CHANGED=0
  600.       X0=(PACMAN_X+15+PACMAN_SPEED)/16
  601.       Y0=PACMAN_Y/16
  602.       Y1=(PACMAN_Y+15)/16
  603.       Z=MAZE_ADDR
  604.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  605.          PACMAN_DIRECTION=2
  606.          PACMAN_ANIM_START=PACMAN_RIGHT_ANIM : PACMAN_ANIM_POINTER=0
  607.          PACMAN_DIRECTION_CHANGED=1
  608.       End If 
  609.    End If 
  610.    '
  611.    ' ***************  
  612.    ' Try And Go Down  
  613.    ' ***************  
  614.    If(Joy(1)=2 or Joy(1)=10 or Joy(1)=6) and PACMAN_DIRECTION<>3 and PACMAN_DIRECTION_CHANGED=0
  615.       X0=PACMAN_X/16
  616.       X1=(PACMAN_X+15)/16
  617.       Y0=(PACMAN_Y+15+PACMAN_SPEED)/16
  618.       Z=MAZE_ADDR
  619.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  620.          PACMAN_DIRECTION=3
  621.          PACMAN_ANIM_START=PACMAN_DOWN_ANIM : PACMAN_ANIM_POINTER=0
  622.          PACMAN_DIRECTION_CHANGED=1
  623.       End If 
  624.    End If 
  625.    '
  626.    ' ***************  
  627.    ' Try And Go Left  
  628.    ' ***************  
  629.    If(Joy(1)=4 or Joy(1)=6 or Joy(1)=5) and PACMAN_DIRECTION<>4 and PACMAN_DIRECTION_CHANGED=0
  630.       X0=(PACMAN_X-PACMAN_SPEED)/16
  631.       Y0=PACMAN_Y/16
  632.       Y1=(PACMAN_Y+15)/16
  633.       Z=MAZE_ADDR
  634.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  635.          PACMAN_DIRECTION=4
  636.          PACMAN_ANIM_START=PACMAN_LEFT_ANIM : PACMAN_ANIM_POINTER=0
  637.          PACMAN_DIRECTION_CHANGED=1
  638.       End If 
  639.    End If 
  640.    '
  641.    ' *******  
  642.    ' Move Up  
  643.    ' *******  
  644.    If PACMAN_DIRECTION=1
  645.       X0=PACMAN_X/16
  646.       X1=(PACMAN_X+15)/16
  647.       Y0=(PACMAN_Y-PACMAN_SPEED)/16
  648.       Z=MAZE_ADDR
  649.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  650.          Add PACMAN_Y,-PACMAN_SPEED
  651.       End If 
  652.    End If 
  653.    '
  654.    ' ********** 
  655.    ' Move Right 
  656.    ' ********** 
  657.    If PACMAN_DIRECTION=2
  658.       X0=(PACMAN_X+15+PACMAN_SPEED)/16
  659.       Y0=PACMAN_Y/16
  660.       Y1=(PACMAN_Y+15)/16
  661.       Z=MAZE_ADDR
  662.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  663.          Add PACMAN_X,PACMAN_SPEED
  664.       End If 
  665.    End If 
  666.    '
  667.    ' *********  
  668.    ' Move Down  
  669.    ' *********  
  670.    If PACMAN_DIRECTION=3
  671.       X0=PACMAN_X/16
  672.       X1=(PACMAN_X+15)/16
  673.       Y0=(PACMAN_Y+15+PACMAN_SPEED)/16
  674.       Z=MAZE_ADDR
  675.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  676.          Add PACMAN_Y,PACMAN_SPEED
  677.       End If 
  678.    End If 
  679.    '
  680.    ' *********  
  681.    ' Move Left
  682.    ' *********  
  683.    If PACMAN_DIRECTION=4
  684.       X0=(PACMAN_X-PACMAN_SPEED)/16
  685.       Y0=PACMAN_Y/16
  686.       Y1=(PACMAN_Y+15)/16
  687.       Z=MAZE_ADDR
  688.       If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  689.          Add PACMAN_X,-PACMAN_SPEED
  690.       End If 
  691.    End If 
  692.    '
  693.    ' ********************** 
  694.    ' Has Pacman Eaten A Dot 
  695.    ' ********************** 
  696.    X0=(PACMAN_X+7)/16
  697.    Y0=(PACMAN_Y+7)/16
  698.    Z=MAZE_ADDR
  699.    BLOCK_ADDR=Z+X0+(Y0*20)
  700.    BLOCK_NUMBER=Peek(BLOCK_ADDR)
  701.    If BLOCK_NUMBER>=_DOT_START and BLOCK_NUMBER<=_DOT_END
  702.       _DOT_X=X0*16 : _DOT_Y=Y0*16 : _DOT_GOT=2
  703.       Poke BLOCK_ADDR,0
  704.       Add _DOT_TO_COLLECT,-1
  705.       Add PACMAN_SCORE,10 : Gosub _SHOW_SCORE
  706.    End If 
  707.    '
  708.    If _DOT_TO_COLLECT=0
  709.       Add ALL_DONE,1
  710.    End If 
  711.    '
  712.    ' ***********************  
  713.    ' Has Pacman Eaten A Pill  
  714.    ' ***********************  
  715.    X0=(PACMAN_X+7)/16
  716.    Y0=(PACMAN_Y+7)/16
  717.    Z=MAZE_ADDR
  718.    BLOCK_ADDR=Z+X0+(Y0*20)
  719.    BLOCK_NUMBER=Peek(BLOCK_ADDR)
  720.    If BLOCK_NUMBER>=PILL_START and BLOCK_NUMBER<=PILL_END
  721.       PILL_X=X0*16 : PILL_Y=Y0*16 : PILL_GOT=2
  722.       Poke BLOCK_ADDR,0
  723.       PILL_TIMER=PILL_TIMER_START
  724.       Sprite 0,PILL_X+128,PILL_Y+45,82
  725.       Wait 25
  726.       Add PACMAN_SCORE,100 : Gosub _SHOW_SCORE
  727.       Sprite Off 0
  728.       ' *********************
  729.       ' change ghosts to blue
  730.       ' *********************
  731.       For K=0 To GHOST_NUMBER
  732.          If GHOST_EYES_TIMER(K)=0
  733.             GHOST_ANIM_START(K)=15
  734.             GHOST_FLASH(K)=0
  735.          End If 
  736.       Next K
  737.    End If 
  738.    '
  739.    ' ************************************** 
  740.    ' Reduce Pill Timer And When Zero Ghosts 
  741.    ' Revert Back 2 Normal 
  742.    ' ************************************** 
  743.    If PILL_TIMER>0
  744.       Add PILL_TIMER,-1
  745.       ' ***************************
  746.       ' Flash Ghosts To Warn Player
  747.       ' That Pill Is Wearing Out 
  748.       ' ***************************
  749.       If PILL_TIMER=PILL_TIMER_START/2
  750.          For K=0 To GHOST_NUMBER
  751.             If GHOST_EYES_TIMER(K)=0
  752.                GHOST_FLASH(K)=1
  753.             End If 
  754.          Next K
  755.       End If 
  756.       ' *********************
  757.       ' Pill Run Out So Put
  758.       ' Ghosts Back To Normal
  759.       ' *********************
  760.       If PILL_TIMER=0
  761.          For K=0 To GHOST_NUMBER
  762.             If GHOST_EYES_TIMER(K)=0
  763.                GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
  764.                GHOST_FLASH(K)=0
  765.             End If 
  766.          Next K
  767.       End If 
  768.    End If 
  769.    '
  770.    ' ******************************** 
  771.    ' Has Pacman Collided With A Ghost 
  772.    ' ******************************** 
  773.    X0=PACMAN_X+2 : X1=PACMAN_X+13 : Y0=PACMAN_Y+2 : Y1=PACMAN_Y+13
  774.    PACMAN_BAD_COLLIDE=0
  775.    For K=0 To GHOST_NUMBER
  776.       X2=GHOST_X(K) : X3=GHOST_X(K)+15 : Y2=GHOST_Y(K) : Y3=GHOST_Y(K)+15
  777.       If((X0>=X2 and X0<=X3) or(X1>=X2 and X1<=X3)) and((Y0>=Y2 and Y0<=Y3) or(Y1>=Y2 and Y1<=Y3))
  778.          If GHOST_EYES_TIMER(K)=0
  779.             ' *************************
  780.             ' Bad Collide = Pacman Dies
  781.             ' *************************
  782.             If PILL_TIMER=0
  783.                PACMAN_BAD_COLLIDE=1
  784.             End If 
  785.             ' ************************** 
  786.             ' Good Collide = Ghost Eaten 
  787.             ' ************************** 
  788.             If PILL_TIMER>0
  789.                GHOST_ANIM_START(K)=20
  790.                GHOST_FLASH(K)=0
  791.                GHOST_EYES_TIMER(K)=GHOST_EYES_TIMER_START
  792.                Sprite 0,GHOST_X(K)+128,GHOST_Y(K)+45,83
  793.                Wait 25
  794.                Add PACMAN_SCORE,200 : Gosub _SHOW_SCORE
  795.                Sprite Off 0
  796.             End If 
  797.          End If 
  798.       End If 
  799.    Next K
  800.    '
  801.    ' *******************************  
  802.    ' If Bad Collision True Set Up 
  803.    ' Pacman To Die And Remove Ghosts  
  804.    ' *******************************  
  805.    If PACMAN_BAD_COLLIDE=1
  806.       PACMAN_STATE=1
  807.       PACMAN_TIMER=25
  808.       PACMAN_ANIM_START=PACMAN_DYING_ANIM
  809.       PACMAN_ANIM_POINTER=0
  810.       '
  811.       For K=0 To GHOST_NUMBER
  812.          GHOST_STATE(K)=3
  813.          GHOST_FLASH=0
  814.          GHOST_EYES_TIMER=-1
  815.       Next K
  816.       '
  817.       FRUIT_TIMER=-1
  818.       PACMAN_BAD_COLLIDE=0
  819.    End If 
  820. End If 
  821. '
  822. ' ******************** 
  823. ' Pause B4 Pacman Dies 
  824. ' ******************** 
  825. If PACMAN_STATE=1
  826.    Add PACMAN_TIMER,-1
  827.    If PACMAN_TIMER=0
  828.       PACMAN_STATE=2
  829.       ' *************
  830.       ' Remove Ghosts
  831.       ' *************
  832.       For K=0 To GHOST_NUMBER
  833.          GHOST_STATE(K)=-1
  834.          GHOST_ANIM_START(K)=25
  835.          GHOST_ANIM_POINTER(K)=0
  836.       Next K
  837.    End If 
  838. End If 
  839. '
  840. ' ***************
  841. ' Pacman Is Dying
  842. ' ***************
  843. If PACMAN_STATE=2
  844.    If PACMAN_ANIM_DELAY=0
  845.       PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START+PACMAN_ANIM_POINTER)
  846.       If PACMAN_FRAME=-1
  847.          PACMAN_FRAME=81
  848.          PACMAN_STATE=3
  849.          PACMAN_TIMER=10
  850.       End If 
  851.       '
  852.       Add PACMAN_ANIM_POINTER,1
  853.    End If 
  854.    '
  855.    Add PACMAN_ANIM_DELAY,1,0 To 1
  856. End If 
  857. '
  858. ' ************************ 
  859. ' Wait B4 Restarting Level 
  860. ' ************************ 
  861. If PACMAN_STATE=3
  862.    Add PACMAN_TIMER,-1
  863.    If PACMAN_TIMER=0
  864.       PACMAN_STATE=4
  865.    End If 
  866. End If 
  867. Return 
  868. '
  869. ' -------------------------------------------------------------
  870. '
  871. ' *************************************************************
  872. '                         DO PACMAN ANIM 
  873. ' *************************************************************
  874. _DO_PACMAN_ANIM:
  875. If PACMAN_STATE=0
  876.    Repeat 
  877.       PACMAN_FRAME=PACMAN_ANIM(PACMAN_ANIM_START+PACMAN_ANIM_POINTER)
  878.       If PACMAN_FRAME=-1
  879.          PACMAN_ANIM_POINTER=0
  880.       End If 
  881.    Until PACMAN_FRAME<>-1
  882.    '
  883.    Add PACMAN_ANIM_POINTER,1
  884. End If 
  885. Return 
  886. '
  887. ' -------------------------------------------------------------
  888. '
  889. ' *************************************************************
  890. '                            DO GHOSTS 
  891. ' *************************************************************
  892. _DO_GHOSTS:
  893. GHOST_NEW_MOVE=0
  894. GHOST_NEW_MOVE_ATTEMPT=0
  895. For K=0 To GHOST_NUMBER
  896.    If GHOST_STATE(K)=0 and GHOST_NEW_MOVE=0
  897.       ' *******************************************************  
  898.       ' Get Opposite To Last Direction So We Don't Double Back 
  899.       ' On Ourselves 
  900.       ' *******************************************************  
  901.       GHOST_OPPOSITE_DIRECTION=GHOST_DIRECTION(K)
  902.       For K0=0 To 1
  903.          Add GHOST_OPPOSITE_DIRECTION,1
  904.          If GHOST_OPPOSITE_DIRECTION>4
  905.             GHOST_OPPOSITE_DIRECTION=1
  906.          End If 
  907.       Next K0
  908.       ' ******************** 
  909.       ' Get Random Direction 
  910.       ' ******************** 
  911.       Repeat 
  912.          Repeat 
  913.             GHOST_POSSIBLE_DIRECTION=GHOST_DIRECTION_LUT(GHOST_DIRECTION_POINTER)
  914.             If GHOST_POSSIBLE_DIRECTION=-1
  915.                GHOST_DIRECTION_POINTER=0
  916.             End If 
  917.          Until GHOST_POSSIBLE_DIRECTION<>-1
  918.          '
  919.          Add GHOST_DIRECTION_POINTER,1
  920.          ' ************** 
  921.          ' Is It Possible 
  922.          ' ************** 
  923.          If GHOST_POSSIBLE_DIRECTION<>GHOST_OPPOSITE_DIRECTION or GHOST_NEW_MOVE_ATTEMPT>4
  924.             ' ** 
  925.             ' Up 
  926.             ' ** 
  927.             If GHOST_POSSIBLE_DIRECTION=1
  928.                X0=GHOST_X(K)/16
  929.                X1=(GHOST_X(K)+15)/16
  930.                Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
  931.                Z=MAZE_ADDR
  932.                If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  933.                   GHOST_DIRECTION(K)=1 : GHOST_STATE(K)=2
  934.                End If 
  935.             End If 
  936.             ' *****
  937.             ' Right
  938.             ' *****
  939.             If GHOST_POSSIBLE_DIRECTION=2
  940.                X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
  941.                Y0=GHOST_Y(K)/16
  942.                Y1=(GHOST_Y(K)+15)/16
  943.                Z=MAZE_ADDR
  944.                If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  945.                   GHOST_DIRECTION(K)=2 : GHOST_STATE(K)=2
  946.                End If 
  947.             End If 
  948.             ' **** 
  949.             ' Down 
  950.             ' **** 
  951.             If GHOST_POSSIBLE_DIRECTION=3
  952.                X0=GHOST_X(K)/16
  953.                X1=(GHOST_X(K)+15)/16
  954.                Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
  955.                Z=MAZE_ADDR
  956.                If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  957.                   GHOST_DIRECTION(K)=3 : GHOST_STATE(K)=2
  958.                End If 
  959.             End If 
  960.             ' **** 
  961.             ' Left 
  962.             ' **** 
  963.             If GHOST_POSSIBLE_DIRECTION=4
  964.                X0=(GHOST_X(K)-GHOST_SPEED(K))/16
  965.                Y0=GHOST_Y(K)/16
  966.                Y1=(GHOST_Y(K)+15)/16
  967.                Z=MAZE_ADDR
  968.                If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  969.                   GHOST_DIRECTION(K)=4 : GHOST_STATE(K)=2
  970.                End If 
  971.             End If 
  972.          End If 
  973.          '
  974.          Add GHOST_NEW_MOVE_ATTEMPT,1
  975.       Until GHOST_STATE(K)=2
  976.       GHOST_NEW_MOVE=1
  977.    End If 
  978.    '
  979.    ' ***********
  980.    ' Move Ghosts
  981.    ' ***********
  982.    If GHOST_STATE(K)=1
  983.       ' ** 
  984.       ' Up 
  985.       ' ** 
  986.       If GHOST_DIRECTION(K)=1
  987.          X0=GHOST_X(K)/16
  988.          X1=(GHOST_X(K)+15)/16
  989.          Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
  990.          Z=MAZE_ADDR
  991.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  992.             Add GHOST_Y(K),-GHOST_SPEED(K)
  993.          Else 
  994.             GHOST_STATE(K)=0
  995.          End If 
  996.          ' ***************
  997.          ' Can We Go Right
  998.          ' ***************
  999.          X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
  1000.          Y0=GHOST_Y(K)/16
  1001.          Y1=(GHOST_Y(K)+15)/16
  1002.          Z=MAZE_ADDR
  1003.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1004.             GHOST_STATE(K)=0
  1005.          End If 
  1006.          ' ************** 
  1007.          ' Can We Go Left 
  1008.          ' ************** 
  1009.          X0=(GHOST_X(K)-GHOST_SPEED(K))/16
  1010.          Y0=GHOST_Y(K)/16
  1011.          Y1=(GHOST_Y(K)+15)/16
  1012.          Z=MAZE_ADDR
  1013.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1014.             GHOST_STATE(K)=0
  1015.          End If 
  1016.       End If 
  1017.       ' *****
  1018.       ' Right
  1019.       ' *****
  1020.       If GHOST_DIRECTION(K)=2
  1021.          X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
  1022.          Y0=GHOST_Y(K)/16
  1023.          Y1=(GHOST_Y(K)+15)/16
  1024.          Z=MAZE_ADDR
  1025.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1026.             Add GHOST_X(K),GHOST_SPEED(K)
  1027.          Else 
  1028.             GHOST_STATE(K)=0
  1029.          End If 
  1030.          ' ************ 
  1031.          ' Can We Go Up 
  1032.          ' ************ 
  1033.          X0=GHOST_X(K)/16
  1034.          X1=(GHOST_X(K)+15)/16
  1035.          Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
  1036.          Z=MAZE_ADDR
  1037.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  1038.             GHOST_STATE(K)=0
  1039.          End If 
  1040.          ' ************** 
  1041.          ' Can We Go Down 
  1042.          ' ************** 
  1043.          X0=GHOST_X(K)/16
  1044.          X1=(GHOST_X(K)+15)/16
  1045.          Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
  1046.          Z=MAZE_ADDR
  1047.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  1048.             GHOST_STATE(K)=0
  1049.          End If 
  1050.       End If 
  1051.       ' **** 
  1052.       ' Down 
  1053.       ' **** 
  1054.       If GHOST_DIRECTION(K)=3
  1055.          X0=GHOST_X(K)/16
  1056.          X1=(GHOST_X(K)+15)/16
  1057.          Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
  1058.          Z=MAZE_ADDR
  1059.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  1060.             Add GHOST_Y(K),GHOST_SPEED(K)
  1061.          Else 
  1062.             GHOST_STATE(K)=0
  1063.          End If 
  1064.          ' ***************
  1065.          ' Can We Go Right
  1066.          ' ***************
  1067.          X0=(GHOST_X(K)+15+GHOST_SPEED(K))/16
  1068.          Y0=GHOST_Y(K)/16
  1069.          Y1=(GHOST_Y(K)+15)/16
  1070.          Z=MAZE_ADDR
  1071.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1072.             GHOST_STATE(K)=0
  1073.          End If 
  1074.          ' ************** 
  1075.          ' Can We Go Left 
  1076.          ' ************** 
  1077.          X0=(GHOST_X(K)-GHOST_SPEED(K))/16
  1078.          Y0=GHOST_Y(K)/16
  1079.          Y1=(GHOST_Y(K)+15)/16
  1080.          Z=MAZE_ADDR
  1081.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1082.             GHOST_STATE(K)=0
  1083.          End If 
  1084.       End If 
  1085.       ' **** 
  1086.       ' Left 
  1087.       ' **** 
  1088.       If GHOST_DIRECTION(K)=4
  1089.          X0=(GHOST_X(K)-GHOST_SPEED(K))/16
  1090.          Y0=GHOST_Y(K)/16
  1091.          Y1=(GHOST_Y(K)+15)/16
  1092.          Z=MAZE_ADDR
  1093.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X0+(Y1*20))<WALL_START
  1094.             Add GHOST_X(K),-GHOST_SPEED(K)
  1095.          Else 
  1096.             GHOST_STATE(K)=0
  1097.          End If 
  1098.          ' ************ 
  1099.          ' Can We Go Up 
  1100.          ' ************ 
  1101.          X0=GHOST_X(K)/16
  1102.          X1=(GHOST_X(K)+15)/16
  1103.          Y0=(GHOST_Y(K)-GHOST_SPEED(K))/16
  1104.          Z=MAZE_ADDR
  1105.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  1106.             GHOST_STATE(K)=0
  1107.          End If 
  1108.          ' ************** 
  1109.          ' Can We Go Down 
  1110.          ' ************** 
  1111.          X0=GHOST_X(K)/16
  1112.          X1=(GHOST_X(K)+15)/16
  1113.          Y0=(GHOST_Y(K)+15+GHOST_SPEED(K))/16
  1114.          Z=MAZE_ADDR
  1115.          If Peek(Z+X0+(Y0*20))<WALL_START and Peek(Z+X1+(Y0*20))<WALL_START
  1116.             GHOST_STATE(K)=0
  1117.          End If 
  1118.       End If 
  1119.       '
  1120.    End If 
  1121.    '
  1122.    ' ********************************************************** 
  1123.    ' This Stops A Ghost Getting A New Direction AND Being Moved 
  1124.    ' In The Same Frame
  1125.    ' ********************************************************** 
  1126.    If GHOST_STATE(K)=2
  1127.       GHOST_STATE(K)=1
  1128.    End If 
  1129.    '
  1130.    ' ************************************ 
  1131.    ' This Deals With The Ghost Eyes Timer 
  1132.    ' ************************************ 
  1133.    If GHOST_EYES_TIMER(K)>0
  1134.       Add GHOST_EYES_TIMER(K),-1
  1135.       If GHOST_EYES_TIMER(K)=GHOST_EYES_TIMER_START/2
  1136.          GHOST_EYES_FLASH(K)=1
  1137.       End If 
  1138.       If GHOST_EYES_TIMER(K)=0
  1139.          GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
  1140.          If PILL_TIMER>0
  1141.             GHOST_ANIM_START(K)=15
  1142.          End If 
  1143.          If PILL_TIMER>0 and PILL_TIMER<PILL_TIMER_START/2
  1144.             GHOST_FLASH(K)=1
  1145.          End If 
  1146.          GHOST_EYES_FLASH(K)=0
  1147.       End If 
  1148.    End If 
  1149.    '
  1150.    ' ***************  
  1151.    ' Ghost Animation  
  1152.    ' ***************  
  1153.    If GHOST_ANIM_DELAY=0
  1154.       ' ************************ 
  1155.       ' Flash Normal Colour/Blue 
  1156.       ' ************************ 
  1157.       If GHOST_FLASH(K)=1
  1158.          If GHOST_ANIM_START(K)=15
  1159.             GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
  1160.          Else 
  1161.             GHOST_ANIM_START(K)=15
  1162.          End If 
  1163.       End If 
  1164.       ' ************************ 
  1165.       ' Flash Normal Colour/Eyes 
  1166.       ' ************************ 
  1167.       If GHOST_EYES_FLASH(K)=1
  1168.          If GHOST_ANIM_START(K)=20
  1169.             If PILL_TIMER>0
  1170.                GHOST_ANIM_START(K)=15
  1171.             Else 
  1172.                GHOST_ANIM_START(K)=GHOST_COLOUR(K)*5
  1173.             End If 
  1174.          Else 
  1175.             GHOST_ANIM_START(K)=20
  1176.          End If 
  1177.       End If 
  1178.       Repeat 
  1179.          GHOST_FRAME(K)=GHOST_ANIM(GHOST_ANIM_START(K)+GHOST_ANIM_POINTER(K))
  1180.          If GHOST_FRAME(K)=-1
  1181.             GHOST_ANIM_POINTER(K)=0
  1182.          End If 
  1183.       Until GHOST_FRAME(K)<>-1
  1184.       '
  1185.       Add GHOST_ANIM_POINTER(K),1
  1186.    End If 
  1187. Next K
  1188. '
  1189. Return 
  1190. '
  1191. ' -------------------------------------------------------------
  1192. '
  1193. ' *************************************************************
  1194. '                            DRAW ALL  
  1195. ' *************************************************************
  1196. _DRAW_ALL:
  1197. Screen 0
  1198. '
  1199. ' *************
  1200. ' Blank Out Dot
  1201. ' *************
  1202. If _DOT_GOT>0
  1203.    Cls 0,_DOT_X,_DOT_Y To _DOT_X+16,_DOT_Y+16
  1204.    Add _DOT_GOT,-1
  1205. End If 
  1206. '
  1207. ' ************** 
  1208. ' Blank Out Pill 
  1209. ' ************** 
  1210. If PILL_GOT>0
  1211.    Cls 0,PILL_X,PILL_Y To PILL_X+16,PILL_Y+16
  1212.    Add PILL_GOT,-1
  1213. End If 
  1214. '
  1215. ' ****** 
  1216. ' Ghosts 
  1217. ' ****** 
  1218. X=2
  1219. For K=0 To GHOST_NUMBER
  1220.    Sprite X,GHOST_X(K)+128,GHOST_Y(K)+45,GHOST_FRAME(K)
  1221.    Add X,2
  1222. Next K
  1223. '
  1224. ' *****
  1225. ' Fruit
  1226. ' *****
  1227. If FRUIT_STATE=1 Then Bob 0,FRUIT_X,FRUIT_Y,FRUIT_FRAME
  1228. '
  1229. ' ****** 
  1230. ' Pacman 
  1231. ' ****** 
  1232. Bob 1,PACMAN_X,PACMAN_Y,PACMAN_FRAME
  1233. Return 
  1234. '
  1235. ' -------------------------------------------------------------
  1236. '
  1237. ' *************************************************************
  1238. '                          DO FRUIT  
  1239. ' *************************************************************
  1240. _DO_FRUIT:
  1241. ' ******************** 
  1242. ' Decrease Fruit Timer 
  1243. ' ******************** 
  1244. Add FRUIT_TIMER,-1
  1245. '
  1246. ' ***********************************************************  
  1247. ' When Timer Reaches Half-Way, Get Co-Ords And Frame And Show
  1248. ' ***********************************************************  
  1249. If FRUIT_TIMER=FRUIT_TIMER_START/2
  1250.    Repeat 
  1251.       FRUIT_X=FRUIT_INFO(FRUIT_INFO_POINTER)
  1252.       If FRUIT_X=-1
  1253.          FRUIT_INFO_POINTER=0
  1254.       End If 
  1255.    Until FRUIT_X<>-1
  1256.    '
  1257.    FRUIT_Y=FRUIT_INFO(FRUIT_INFO_POINTER+1)
  1258.    FRUIT_FRAME=FRUIT_INFO(FRUIT_INFO_POINTER+2)
  1259.    '
  1260.    Add FRUIT_INFO_POINTER,3
  1261.    '
  1262.    FRUIT_STATE=1
  1263. End If 
  1264. '
  1265. ' *******************************  
  1266. ' If Timer Runs Out, Remove Fruit
  1267. ' *******************************  
  1268. If FRUIT_TIMER=0
  1269.    Bob Off 0
  1270.    FRUIT_STATE=0 : FRUIT_TIMER=FRUIT_TIMER_START
  1271. End If 
  1272. '
  1273. ' ****************************** 
  1274. ' Has Pacman Collided With Fruit 
  1275. ' ****************************** 
  1276. If FRUIT_STATE=1
  1277.    X0=PACMAN_X+3 : X1=PACMAN_X+12 : Y0=PACMAN_Y+3 : Y1=PACMAN_Y+12
  1278.    X2=FRUIT_X : X3=FRUIT_X+15 : Y2=FRUIT_Y : Y3=FRUIT_Y+15
  1279.    ' ***********************************
  1280.    ' Yes, So Remove Fruit, Add Score Etc
  1281.    ' ***********************************
  1282.    If((X0>=X2 and X0<=X3) or(X1>=X2 and X1<=X3)) and((Y0>=Y2 and Y0<=Y3) or(Y1>=Y2 and Y1<=Y3))
  1283.       Bob Off 0
  1284.       FRUIT_STATE=0 : FRUIT_TIMER=FRUIT_TIMER_START
  1285.       Sprite 0,FRUIT_X+128,FRUIT_Y+45,82
  1286.       Wait 25
  1287.       Add PACMAN_SCORE,100 : Gosub _SHOW_SCORE
  1288.       Sprite Off 0
  1289.    End If 
  1290. End If 
  1291. Return 
  1292. '  
  1293. ' -------------------------------------------------------------
  1294. '
  1295. ' *************************************************************
  1296. '                          SHOW LIVES  
  1297. ' *************************************************************
  1298. _SHOW_LIVES:
  1299. Screen 1
  1300. For K=1 To PACMAN_LIVES
  1301.    Paste Bob K*16,8,PACMAN_ANIM(11)
  1302. Next K
  1303. Return 
  1304. '
  1305. ' -------------------------------------------------------------
  1306. '
  1307. ' *************************************************************
  1308. '                            SHOW SCORE  
  1309. ' *************************************************************
  1310. _SHOW_SCORE:
  1311. Screen 1
  1312. Locate 25+6,1
  1313. Print "    "
  1314. Locate 25+6,1
  1315. Print PACMAN_SCORE
  1316. '
  1317. ' ***************************
  1318. ' Does Hi-Score Need Updating
  1319. ' ***************************
  1320. If PACMAN_SCORE>PACMAN_HISCORE
  1321.    PACMAN_HISCORE=PACMAN_SCORE
  1322. End If 
  1323. '
  1324. Locate 25+6,2
  1325. Print "    "
  1326. Locate 25+6,2
  1327. Print PACMAN_HISCORE
  1328. Return 
  1329. '
  1330. ' -------------------------------------------------------------
  1331. '
  1332. ' *************************************************************
  1333. '                    PACMAN ANIMATION DATA 
  1334. ' *************************************************************
  1335. ' ** 
  1336. ' Up 
  1337. ' ** 
  1338. PACMAN_ANIM_DATA:
  1339. Data 47,48,49,50,51,52,51,50,49,48,-1
  1340. ' *****
  1341. ' Right
  1342. ' *****
  1343. Data 53,54,55,56,57,58,57,56,55,54,-1
  1344. ' **** 
  1345. ' Down 
  1346. ' **** 
  1347. Data 59,60,61,62,63,64,63,62,61,60,-1
  1348. ' **** 
  1349. ' Left 
  1350. ' **** 
  1351. Data 65,66,67,68,69,70,69,68,67,66,-1
  1352. '
  1353. ' *****
  1354. ' Dying
  1355. ' *****
  1356. Data 71,72,73,74,75,76,77,78,79,80,81,-1
  1357. '
  1358. ' -------------------------------------------------------------
  1359. '
  1360. ' *************************************************************
  1361. '                     GHOST ANIMATION DATA 
  1362. ' *************************************************************
  1363. ' *********  
  1364. ' Ghost:Red
  1365. ' *********  
  1366. GHOST_ANIM_DATA:
  1367. Data 89,90,91,92,-1
  1368. '
  1369. ' ************ 
  1370. ' Ghost:Yellow 
  1371. ' ************ 
  1372. Data 93,94,95,96,-1
  1373. '
  1374. ' ***********
  1375. ' Ghost:Green
  1376. ' ***********
  1377. Data 97,98,99,100,-1
  1378. '
  1379. ' ********** 
  1380. ' Ghost:Blue 
  1381. ' ********** 
  1382. Data 101,102,103,104,-1
  1383. '
  1384. ' ********** 
  1385. ' Ghost:Eyes 
  1386. ' ********** 
  1387. Data 105,106,107,108,-1
  1388. '
  1389. ' ***********
  1390. ' Ghost:Blank
  1391. ' ***********
  1392. Data 109,-1
  1393. '
  1394. ' -------------------------------------------------------------
  1395. '
  1396. ' And That's Yer Lot!
  1397. '
  1398.